/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package practica1.manejoExperimento;

import es.miguelgonzalez.jgraficacomida.JGraficaComidaDibujo;
import es.miguelgonzalez.jgraficacomida.ModeloGraficaComida;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.table.JTableHeader;
import practica1.language.Language;
import practica1.logic.LogicExperimento;
import practica1.logic.LogicPoblacion;
import practica1.ui.tablaPoblacion.ModeloPoblacionTabla;
import practica1.ui.tablaPoblacion.TablaPoblacion;

/**
 * Clase que permite imprimir un experimento
 * @author Miguel González - Ceura
 */
public class ImprimirExperimento {
    
    private static Font fuente = new Font("Dialog", Font.PLAIN, 10);
    private static Font fuenteG = new Font("Dialog", Font.BOLD, 12);
    private static int margenSuperior = 60;
    private static int margenIzquierdo = 60;
    private static int contadorNumLinea = 0;
    private static Graphics pagina = null;
    private static PrintJob pj = null;
    
    /**
     * Clase estática que imprime por impresora un experimento
     * @param experimento Recibe un experimento a imprimir
     */
    public static void imprimir(LogicExperimento experimento) {
        nuevaPagina(experimento);

                    
        imprimirLineaVacia();
        imprimirLineaVacia();
        pagina.setFont(fuenteG);
        imprimirLinea(Language.getI().getP("NOMBRE_EXPERIMENTO") + ": " + 
                experimento.getNombreExperimento(), 20);
        pagina.setFont(fuente);
        imprimirLineaVacia();
        imprimirLinea(Language.getI().getP("NUMERO_POBLACIONES") + ": " +
                experimento.countPoblaciones() , 0);
        
        imprimirLinea(Language.getI().getP("NOMBRE_INVESTIGADOR") + ": " +
                experimento.getNombreInvestigador() , 0);
        
        imprimirLinea(Language.getI().getP("PROYECTO_INVESTIGACION") + ": " +
                experimento.getProyectoInvestigacion() , 0);
        
        imprimirLinea(Language.getI().getP("TIPO_BACTERIA") +
                experimento.getTipoBacteria() , 0);
        
        ArrayList<LogicPoblacion> poblaciones = experimento.getPoblaciones();
        //Recorremos las poblaciones
        for(LogicPoblacion poblacion : poblaciones) {
            //Creamos una página por experimento
            nuevaPagina(experimento);

            imprimirLinea(Language.getI().getP("POBLACION") + ": " +
                    poblacion.getNombrePoblacion(), 0);
            
            imprimirLinea(Language.getI().getP("FECHA_COMIENZO_POBLACION") +
                    ": " + poblacion.getFecha(), 10);
            imprimirLinea(Language.getI().getP("CONDICIONES_LUMINOSIDAD") +
                    ": " + poblacion.getLuminosidad(), 10);
            imprimirLinea(Language.getI().getP("TAMANIO_POBLACION") +
                    ": " + 
                    poblacion.getTamanioPoblacion(), 10);
            imprimirLinea(Language.getI().getP("TEMPERATURA") +
                    ": " + poblacion.getTemperatura()
                    + poblacion.getEscalaTemperatura(), 10);
            
            imprimirLineaVacia();
            //Imprimimos los datos del modelo de la gráfica
            ModeloGraficaComida grafica = poblacion.getModeloGraficaComida();
            imprimirLinea(Language.getI().getP("DATOS_GRAFICA_COMIDA"), 0);
            
            imprimirLinea(Language.getI().getP("ALIMENTACION_INICIAL") +
                    ": " + grafica.getAlimentoInicial(), 10);
            imprimirLinea(Language.getI().getP("ALIMENTACION_MAXIMA") +
                    ": " + grafica.getAlimentoMax(), 10);
            imprimirLinea(Language.getI().getP("DIA_ALIMENTACION_MAXIMA") +
                    ": " + grafica.getDiaMax(), 10);
            imprimirLinea(Language.getI().getP("ALIMENTACION_FINAL") +
                    ": " + grafica.getAlimentoFinal(), 10);

            //Pintamos la gráfica
            Graphics graphicGrafica = pagina.create(250, 30, 300, 200);
            JGraficaComidaDibujo jGrafica = new JGraficaComidaDibujo(grafica);
            jGrafica.setSize(300,200);
            jGrafica.paintComponent(graphicGrafica);
            
            //Imprimimos los datos del modelo de la tabla
            Graphics graphicTabla = pagina.create(70, 220, 500, 530);
            ModeloPoblacionTabla modeloTabla = poblacion.getModeloPoblacionTabla();
            TablaPoblacion tablaPoblacion = new TablaPoblacion(modeloTabla);
            JTableHeader header = tablaPoblacion.getTableHeader();
            
            tablaPoblacion.setSize(1, 470);
            header.setSize(tablaPoblacion.getWidth(), 30);

            tablaPoblacion.setPreferredScrollableViewportSize(
                    tablaPoblacion.getPreferredSize());

            
            
            header.paint(graphicTabla);
            graphicTabla.translate(0, header.getHeight());
            tablaPoblacion.paint(graphicTabla);
        }
        
        
        //Terminamos la impresión
        finImpresion();
    }
    
    /**
     * Imprime una línea en un Graphics de la impresora
     * @param linea String a imprimir
     * @param margenIzquierdoExtra Margen izq. respecto a la hoja donde se imprime
     */
    private static void imprimirLinea(String linea, int margenIzquierdoExtra) {
        pagina.drawString(linea , margenIzquierdo + margenIzquierdoExtra,
                margenSuperior + contadorNumLinea * 15);
        contadorNumLinea++;
    }
    
    /**
     * Imprime una línea vacía
     */
    private static void imprimirLineaVacia() {
        contadorNumLinea++;
    }
    
    /**
     * Crea una nueva página donde se va a imprimir, si es la primera vez
     * pregunta que impresora se quiere utilizar.
     * @param experimento Recibe un experimento
     */
    private static void nuevaPagina(LogicExperimento experimento) {
        if(pj == null) {
            pj = Toolkit.getDefaultToolkit().
                getPrintJob(new Frame(), experimento.getNombreExperimento()
                , null);
            //Si se pulsa cancelar pj vale null
        } else {
            pagina.dispose();
        }
        
        if(pj == null) {
            throw new RuntimeException("Se ha pulsado cancelar");
        }
            contadorNumLinea = 0;
            pagina = pj.getGraphics();
            pagina.setFont(fuente);
            pagina.setColor(Color.black);
    }
    
    /**
     * Finaliza la impresión
     */
    private static void finImpresion() {
        pagina.dispose();
        pj.end();
        pj = null;
        pagina = null;
        contadorNumLinea = 0;
    }
}
